home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / crt / symm.md / values.h < prev   
C/C++ Source or Header  |  1990-08-10  |  5KB  |  147 lines

  1. /* $Copyright:    $
  2.  * Copyright (c) 1984, 1985 Sequent Computer Systems, Inc.
  3.  * All rights reserved
  4.  *  
  5.  * This software is furnished under a license and may be used
  6.  * only in accordance with the terms of that license and with the
  7.  * inclusion of the above copyright notice.   This software may not
  8.  * be provided or otherwise made available to, or used by, any
  9.  * other person.  No title to or ownership of the software is
  10.  * hereby transferred.
  11.  */
  12.  
  13. /* $Header: values.h 1.1 86/02/24 $ */
  14.  
  15. #ifndef BITSPERBYTE
  16. /* These values work with any binary representation of integers
  17.  * where the high-order bit contains the sign. */
  18.  
  19. /* a number used normally for size of a shift */
  20. #if gcos
  21. #define BITSPERBYTE    9
  22. #else
  23. #define BITSPERBYTE    8
  24. #endif
  25. #define BITS(type)    (BITSPERBYTE * (int)sizeof(type))
  26.  
  27. /* short, regular and long ints with only the high-order bit turned on */
  28. #define HIBITS    ((short)(1 << BITS(short) - 1))
  29. #define HIBITI    (1 << BITS(int) - 1)
  30. #define HIBITL    (1L << BITS(long) - 1)
  31.  
  32. /* largest short, regular and long int */
  33. #define MAXSHORT    ((short)~HIBITS)
  34. #define MAXINT    (~HIBITI)
  35. #define MAXLONG    (~HIBITL)
  36.  
  37. /* various values that describe the binary floating-point representation
  38.  * _EXPBASE    - the exponent base
  39.  * DMAXEXP     - the maximum exponent of a double (as returned by frexp())
  40.  * FMAXEXP     - the maximum exponent of a float  (as returned by frexp())
  41.  * DMINEXP     - the minimum exponent of a double (as returned by frexp())
  42.  * FMINEXP     - the minimum exponent of a float  (as returned by frexp())
  43.  * MAXDOUBLE    - the largest double
  44.             ((_EXPBASE ** DMAXEXP) * (1 - (_EXPBASE ** -DSIGNIF)))
  45.  * MAXFLOAT    - the largest float
  46.             ((_EXPBASE ** FMAXEXP) * (1 - (_EXPBASE ** -FSIGNIF)))
  47.  * MINDOUBLE    - the smallest double (_EXPBASE ** (DMINEXP - 1))
  48.  * MINFLOAT    - the smallest float (_EXPBASE ** (FMINEXP - 1))
  49.  * DSIGNIF    - the number of significant bits in a double
  50.  * FSIGNIF    - the number of significant bits in a float
  51.  * DMAXPOWTWO    - the largest power of two exactly representable as a double
  52.  * FMAXPOWTWO    - the largest power of two exactly representable as a float
  53.  * _IEEE    - 1 if IEEE standard representation is used
  54.  * _DEXPLEN    - the number of bits for the exponent of a double
  55.  * _FEXPLEN    - the number of bits for the exponent of a float
  56.  * _HIDDENBIT    - 1 if high-significance bit of mantissa is implicit
  57.  * LN_MAXDOUBLE    - the natural log of the largest double  -- log(MAXDOUBLE)
  58.  * LN_MINDOUBLE    - the natural log of the smallest double -- log(MINDOUBLE)
  59.  */
  60. #if u3b || u3b5 || ns32000 || i386
  61. #if ns32000 || i386
  62. #define    DBIAS    ((1 << _DEXPLEN - 1) - 1 )
  63. #define    FBIAS    ((1 << _FEXPLEN - 1) - 1 )
  64. extern double _maxdouble, _mindouble;
  65. extern float _maxfloat, _minfloat;
  66.  
  67. #define MAXDOUBLE    _maxdouble
  68. #define MAXFLOAT    _maxfloat
  69. #define MINDOUBLE    _mindouble
  70. #define MINFLOAT    _minfloat
  71. #else    /* not (ns32000 || i386) */
  72. #define MAXDOUBLE    1.79769313486231470e+308
  73. #define MAXFLOAT    ((float)3.40282346638528860e+38)
  74. #define MINDOUBLE    4.94065645841246544e-324
  75. #define MINFLOAT    ((float)1.40129846432481707e-45)
  76. #endif    /* not (ns32000 || i386) */
  77. #define    _IEEE        1
  78. #define _DEXPLEN    11
  79. #define _HIDDENBIT    1
  80. #if ns32000 || i386
  81. #define DMINEXP    (-(DMAXEXP - 3))
  82. #define FMINEXP    (-(FMAXEXP - 3))
  83. #else    /* ns32000 || i386 */
  84. #define DMINEXP    (-(DMAXEXP + DSIGNIF - _HIDDENBIT - 3))
  85. #define FMINEXP    (-(FMAXEXP + FSIGNIF - _HIDDENBIT - 3))
  86. #endif    /* ns32000 || i386 */
  87.  
  88. #endif
  89. #if pdp11 || vax
  90. #define MAXDOUBLE    1.701411834604692293e+38
  91. #define MAXFLOAT    ((float)1.701411733192644299e+38)
  92. /* The following is kludged because the PDP-11 compilers botch the simple form.
  93.    The kludge causes the constant to be computed at run-time on the PDP-11,
  94.    even though it is still "folded" at compile-time on the VAX. */
  95. #define MINDOUBLE    (0.01 * 2.938735877055718770e-37)
  96. #define MINFLOAT    ((float)MINDOUBLE)
  97. #define _IEEE        0
  98. #define _DEXPLEN    8
  99. #define _HIDDENBIT    1
  100. #define DMINEXP    (-DMAXEXP)
  101. #define FMINEXP    (-FMAXEXP)
  102. #endif
  103. #if gcos
  104. #define MAXDOUBLE    1.7014118346046923171e+38
  105. #define MAXFLOAT    ((float)1.7014118219281863150e+38)
  106. #define MINDOUBLE    2.9387358770557187699e-39
  107. #define MINFLOAT    ((float)MINDOUBLE)
  108. #define _IEEE        0
  109. #define _DEXPLEN    8
  110. #define _HIDDENBIT    0
  111. #define DMINEXP    (-(DMAXEXP + 1))
  112. #define FMINEXP    (-(FMAXEXP + 1))
  113. #endif
  114. #if u370
  115. #define _LENBASE    4
  116. #else
  117. #define _LENBASE    1
  118. #endif
  119. #define _EXPBASE    (1 << _LENBASE)
  120. #define _FEXPLEN    8
  121. #define DSIGNIF    (BITS(double) - _DEXPLEN + _HIDDENBIT - 1)
  122. #define FSIGNIF    (BITS(float)  - _FEXPLEN + _HIDDENBIT - 1)
  123. #define DMAXPOWTWO    ((double)(1L << BITS(long) - 2) * \
  124.                 (1L << DSIGNIF - BITS(long) + 1))
  125. #define FMAXPOWTWO    ((float)(1L << FSIGNIF - 1))
  126. #define DMAXEXP    ((1 << _DEXPLEN - 1) - 1 + _IEEE)
  127. #define FMAXEXP    ((1 << _FEXPLEN - 1) - 1 + _IEEE)
  128. #define LN_MAXDOUBLE    (M_LN2 * DMAXEXP)
  129. #define LN_MINDOUBLE    (M_LN2 * (DMINEXP - 1))
  130. #define H_PREC    (DSIGNIF % 2 ? (1L << DSIGNIF/2) * M_SQRT2 : 1L << DSIGNIF/2)
  131. #define X_EPS    (1.0/H_PREC)
  132. #define X_PLOSS    ((double)(long)(M_PI * H_PREC))
  133. #define X_TLOSS    (M_PI * DMAXPOWTWO)
  134. #define M_LN2    0.69314718055994530942
  135. #define M_PI    3.14159265358979323846
  136. #define M_SQRT2    1.41421356237309504880
  137. #define MAXBEXP    DMAXEXP /* for backward compatibility */
  138. #define MINBEXP    DMINEXP /* for backward compatibility */
  139. #define MAXPOWTWO    DMAXPOWTWO /* for backward compatibility */
  140.  
  141. /* IEEE floating point format .. for NS32000 and Intel 386 */
  142. union dbl {
  143.     struct { double d; } dd;
  144.     struct { unsigned ffl:32, ffh:20, ee:11, ss:1; } db;
  145. };
  146. #endif
  147.